package threadUtils.demo02;

import threadUtils.Goods;

import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

/**
 * CyclicBarrier:循环屏障，同步助手工具类
 * 等待所有子线程结束，在进行接下来任务
 */
public class CyclicBarrierExample01 {

    public static void main(String[] args) throws BrokenBarrierException, InterruptedException {

        List<Goods> list = Goods.getGoodsList();
        // 初始化CyclicBarrier，并设置分片，作用与计数器类似。这里多设置一个主线程
        final CyclicBarrier cyclicBarrier = new CyclicBarrier(list.size() + 1);
        list.forEach(goods -> {
            new Thread(() -> {
                try {
                    // 模拟业务逻辑
                    TimeUnit.MILLISECONDS.sleep(20);
                    goods.setThreadContent(Thread.currentThread().getName());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        // 子线程运行结束时，等待其他线程也到达这个点
                        int await = cyclicBarrier.await();
                        System.out.println("到底次序：" + await);
                    } catch (InterruptedException | BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        });
        int await = cyclicBarrier.await();
        System.out.println("到底次序：" + await);
        list.forEach(System.out::println);
    }

}
